﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RevisionTool
{
    public class DataRevision
    {
        /// <summary>
        /// 将数据进行修约
        /// 采用标准是四舍六入5凑偶的方法
        /// </summary>
        /// <param name="raw">被修约数</param>
        /// <param name="interval">修约间距，例如：我要修约到100位，则interval=100</param>
        /// <returns>返回修约的结果</returns>
        public static double Revision(double raw, double interval)
        {
            if (interval == 0)
                return raw;

            //计算小数点后保留位数
            var spt = interval.ToString().Split('.');
            int fractional = spt.Length == 2 ? spt[1].Length : 0;
            //将数值修正到个位
            var data = raw / interval;
            //判断后面是否有小数
            var str = ((decimal)data).ToString();
            var dspt = str.Split('.');
            int isFractional = dspt.Length == 2 ? dspt[1].Length : 0;
            var interger = Convert.ToInt64(dspt[0]);//整数部分
            if (isFractional > 0)//存在小数
            {
                //判断小数长度
                var frac = dspt[1].ToString();
                var fracFirstStr = frac.Substring(0, 1);//获取小数点后第一个数字
                var fracFirst = Convert.ToInt32(fracFirstStr);
                if (fracFirst >= 6)
                {
                    interger += 1;
                    return interger * interval;
                }
                else if (fracFirst <= 4)
                {
                    interger += 0;
                    return interger * interval;
                }
                else // 5
                {
                    //判断5后面是否有数据
                    if (isFractional >= 2)
                    {
                        var fracSecondStr = frac.Substring(1, isFractional-1);//获取小数点后第一个数字
                        var fracSecond = Convert.ToInt32(fracSecondStr);
                        if (fracSecond > 0)
                        {
                            interger += 1;
                        }
                        else //后面没有数据的话，直接看前面奇偶
                        {
                            var gewei = interger % 10; //获取个位数的内容
                            if ((gewei == 1) || (gewei == 3) || (gewei == 5) || (gewei == 7) || (gewei == 9))
                            {
                                interger += 1;
                            }
                        }
                        return interger * interval;
                    }
                    else //后面没有数据的话，直接看前面奇偶
                    {
                        var gewei = interger % 10; //获取个位数的内容
                        if ((gewei == 1) || (gewei == 3) || (gewei == 5) || (gewei == 7) || (gewei == 9))
                        {
                            interger += 1;
                        }
                        return interger * interval;
                    }
                }
            }
            return data * interval;
        }

    }
}
